package com.java.threadpool.test1;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 创建线程第四种方式：使用线程池
 * JDK5.0起提供了线程池相关API：ExecutorService和Executors
 * <p>
 * ExecutorService：真正的线程池接口，常见子类ThreapoolExecutor
 * void execute（Runnable command）：执行命令/任务，没有返回值，一般用来执行Runnable
 *
 * <T>Future<T>submit(callable<T>task): 执行任务，有返回值，一般用来执行Callable
 * <p>
 * void shutdown（）：关闭连接池
 * <p>
 * Executors.newFixedThreadPool();       //创建一个可重用固定线程数的线程池
 * Executors.newCachedThreadPool();      //创建一个可根据需要创建新线程的线程池
 * Executors.newSingleThreadExecutor();  //创建一个只有一个线程的线程池
 * Executors.newScheduledThreadPool();   //创建一个线程池，它可安排在给定延迟后运行命令或者定期的执行
 * <p>
 * 好处： 1.提高响应速度（减少创建新线程的时间）
 * 2.降低资源消耗（重复利用线程池中线程，不需要每次都创建）
 * 3.便于线程管理
 * corePoolSize  线程池大小
 * maximumPoolSize： 最大线程数
 * keepAliveTime：线程没有任务时最多保持多长时间后终止
 * <p>
 * 面试题：创建多线程的四种方式
 *
 * @author luzhikun
 * @date &{DATE}-10:36
 */
public class ThreadLoke {
    public static void main(String[] args) {
        //1.提供指定线程数量的线程池
        ExecutorService service = Executors.newFixedThreadPool(15);
        //设置线程池的属性
//        ThreadPoolExecutor service1= (ThreadPoolExecutor) service;
//        service1.setCorePoolSize(10);
//        service1.allowCoreThreadTimeOut(true);
        //2.执行指定的线程操作，需要提供一个实现Runnable接口的对象或Callable接口的对象
        service.execute(new newThread_2());   //适合Runnable接口
        service.execute(new newThread_3());   //适合Runnable接口
        //service.submit(Callable callable);                   //适合Callable接口
        //3.关闭连接池
        service.shutdown();


    }
}

class newThread_2 implements Runnable {

    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            if (i % 2 == 0) {
                System.out.println(Thread.currentThread().getName() + ": " + i);
            }

        }
    }
}

class newThread_3 implements Runnable {

    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            if (i % 2 != 0) {
                System.out.println(Thread.currentThread().getName() + ": " + i);
            }

        }
    }
}
